﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Lightbug.CharacterControllerPro.Core;
using Lightbug.CharacterControllerPro.Implementation;
using Lightbug.Utilities;

namespace Lightbug.CharacterControllerPro.Demo
{

    [AddComponentMenu("Character Controller Pro/Demo/Character/AI/Wander Behaviour")]
    public class AIWanderBehaviour : CharacterAIBehaviour
    {
        [Min(0f)]
        [SerializeField]
        float minRandomMagnitude = 1f;

        [Min(0f)]
        [SerializeField]
        float maxRandomMagnitude = 1f;

        [Min(0f)]
        [SerializeField]
        float minRandomYawAngle = 100f;

        [Min(0f)]
        [SerializeField]
        float maxRandomYawAngle = 280f;

        [Min(0f)]
        [SerializeField]
        float waitSeconds = 3f;

        float timer = 0f;

        Vector3 initialPosition = default(Vector3);

        Vector3 target = default(Vector3);

        void OnValidate()
        {
            if (minRandomMagnitude > maxRandomMagnitude)
                minRandomMagnitude = maxRandomMagnitude;

            if (maxRandomMagnitude < minRandomMagnitude)
                maxRandomMagnitude = minRandomMagnitude;

            if (minRandomYawAngle > maxRandomYawAngle)
                minRandomYawAngle = maxRandomYawAngle;

            if (maxRandomYawAngle < minRandomYawAngle)
                maxRandomYawAngle = minRandomYawAngle;
        }



        public override void EnterBehaviour(float dt)
        {
            initialPosition = transform.position;

            target = initialPosition + transform.forward * Random.Range(minRandomMagnitude, maxRandomMagnitude);
            timer = 0f;
        }

        public override void UpdateBehaviour(float dt)
        {

            if (timer >= waitSeconds)
            {
                timer = 0f;

                SetTarget();

            }
            else
            {
                timer += dt;
            }

            float distanceToTarget = (target - CharacterActor.Position).magnitude;

            if (distanceToTarget > 0.5f)
                SetMovementAction(target - CharacterActor.Position);
            else
                characterActions.Reset();
        }


        void SetTarget()
        {
            Vector3 centerToTargetDir = target - initialPosition;
            centerToTargetDir.Normalize();

            centerToTargetDir = Quaternion.Euler(0, Random.Range(minRandomYawAngle, maxRandomYawAngle), 0f) * centerToTargetDir;

            target = initialPosition + centerToTargetDir * Random.Range(minRandomMagnitude, maxRandomMagnitude);
        }

    }

}
